package com.sheng.leetcode.year2022.month07.day05;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liusheng
 * @date 2022/07/05
 *
 * 729. 我的日程安排表 I
 *
 * 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ，则可以存储这个新的日程安排。
 * 当两个日程安排有一些时间上的交叉时（例如两个日程安排都在同一时间内），就会产生 重复预订 。
 * 日程可以用一对整数 start 和 end 表示，这里的时间是半开区间，即 [start, end), 实数 x 的范围为，start <= x < end 。
 * 实现 MyCalendar 类：
 * MyCalendar() 初始化日历对象。
 * boolean book(int start, int end) 如果可以将日程安排成功添加到日历中而不会导致重复预订，返回 true 。
 * 否则，返回 false 并且不要将该日程安排添加到日历中。
 *
 * 示例：
 *
 * 输入：
 * ["MyCalendar", "book", "book", "book"]
 * [[], [10, 20], [15, 25], [20, 30]]
 * 输出：
 * [null, true, false, true]
 *
 * 解释：
 * MyCalendar myCalendar = new MyCalendar();
 * myCalendar.book(10, 20); // return True
 * myCalendar.book(15, 25); // return False ，这个日程安排不能添加到日历中，因为时间 15 已经被另一个日程安排预订了。
 * myCalendar.book(20, 30); // return True ，这个日程安排可以添加到日历中，因为第一个日程安排预订的每个时间都小于 20 ，且不包含时间 20 。
 *
 * 提示：
 *
 * 0 <= start < end <= 109
 * 每个测试用例，调用 book 方法的次数最多不超过 1000 次。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/my-calendar-i
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0729 {

    @Test
    public void test01(){
        MyCalendar obj = new MyCalendar();
        // return True
//        System.out.println(obj.book(10, 20));
        // return False
//        System.out.println(obj.book(15, 25));
        // return True
//        System.out.println(obj.book(20, 30));

//        System.out.println(obj.book(47, 50));
//        System.out.println(obj.book(33, 41));
//        System.out.println(obj.book(39, 45));
//        System.out.println(obj.book(33, 42));
//        System.out.println(obj.book(25, 32));
//        System.out.println(obj.book(26, 35));
//        System.out.println(obj.book(19, 25));
//        System.out.println(obj.book(3, 8));
//        System.out.println(obj.book(8, 13));
//        System.out.println(obj.book(18, 27));

        System.out.println(obj.book(19, 30));
        System.out.println(obj.book(33, 51));
        System.out.println(obj.book(53, 63));
        System.out.println(obj.book(75, 92));
        System.out.println(obj.book(97, 100));
        System.out.println(obj.book(13, 32));
    }

}
class MyCalendar {

    Map<Integer, Integer> map;
    public MyCalendar() {
        map = new HashMap<Integer, Integer>(16);
    }

    public boolean book(int start, int end) {
//        boolean flag = true;
        for (Integer integer : map.keySet()) {
            //和之前的日期存在重合的部分
//            boolean b1 = integer <= start && map.get(integer) > start;
//            boolean b2 = integer < end && map.get(integer) >= end;
//            boolean b3 = integer >= start && map.get(integer) <= end;
//            if (b1 || b2 || b3) {
//                flag = false;
//                break;
//            }
            if (start > map.get(integer) || end <= integer) {
                continue;
            }
            return false;
        }
//        if (flag) {
//            map.put(start, end);
//        }
//        return flag;
        map.put(start, end);
        return true;
    }
}

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar obj = new MyCalendar();
 * boolean param_1 = obj.book(start,end);
 */

//class MyCalendar {
//    List<int[]> list = new ArrayList<>();
//    public boolean book(int start, int end) {
//        end--;
//        for (int[] info : list) {
//            int l = info[0], r = info[1];
//            if (start > r || end < l) continue;
//            return false;
//        }
//        list.add(new int[]{start, end});
//        return true;
//    }
//}
//
//作者：AC_OIer
//链接：https://leetcode.cn/problems/my-calendar-i/solution/by-ac_oier-hnjl/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
